//////////////////////////////////////////////////////////////////////////
//
// GAM203
// Light Class
// Light.h
// 
// Grant Johnson
// Qantm College
// 27/10/2010
//
//////////////////////////////////////////////////////////////////////////

#ifndef LIGHT_H
#define LIGHT_H

#include <d3d9.h>
#include <d3d9types.h>

struct D3DXCOLOR;

class Light
{
public:
	Light();
	~Light();

	//////////////////////////////////////////////////////////////////////////
	// Initiate an Omni Point light
	// Sets the Position, Diffuse, Ambient, Specular, Range and Attenuation 
	// values of the light
	//
	// Paramaters:
	// None
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void InitOmni();

	//////////////////////////////////////////////////////////////////////////
	// Initiates a Spot light
	// Sets the Position, Cone, Direction, Ambient, Diffuse, Specular, Range
	// and Attenuation of the light.
	//
	// Paramaters:
	// None
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void InitSpot();

	//////////////////////////////////////////////////////////////////////////
	// Initiates a directional light
	// Sets the Normalized direction, Ambient, Diffuse and Specular values
	// of the light
	//
	// Paramaters:
	// None
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void InitDirectional();

	//////////////////////////////////////////////////////////////////////////
	// Set the position of the light
	//
	// Paramaters:
	// a_xPos, the x position of the light
	// a_yPos, the y position of the light
	// a_zPos, the z position of the light
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetPosition(float a_xPos, float a_yPos, float a_zPos);

	//////////////////////////////////////////////////////////////////////////
	// Set the position of the light using a vector
	//
	// Paramaters:
	// a_pos, a D3DVECTOR reference to set the position of the light
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetPosition(const D3DVECTOR& a_pos);

	//////////////////////////////////////////////////////////////////////////
	// Set the direction of the light
	//
	// Paramaters:
	// a_dit, a D3DVECTOR that states the direction the light is facing
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetDirection(const D3DVECTOR& a_dir);

	//////////////////////////////////////////////////////////////////////////
	// Set the ambient values of the light
	//
	// Paramaters:
	// a_red, set the red ambient value
	// a_green, set the green ambient value
	// a_blue, set the blue ambient value
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetAmbient(float a_red, float a_green, float a_blue);

	//////////////////////////////////////////////////////////////////////////
	// Set the diffuse values of the light
	//
	// Paramaters:
	// a_red, set the red diffuse value
	// a_green, set the green diffuse value
	// a_blue, set the blue diffuse value
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetDiffuse(float a_red, float a_green, float a_blue);

	//////////////////////////////////////////////////////////////////////////
	// Set the specular values of the light
	//
	// Paramaters:
	// a_red, set the red specular value
	// a_green, set the green specular value
	// a_blue, set the blue specular value
	//
	// Returns void 
	//
	//////////////////////////////////////////////////////////////////////////
	void SetSpecular(float a_red, float a_green, float a_blue);

	//////////////////////////////////////////////////////////////////////////
	// Set the range of the light
	//
	// Paramaters:
	// a_range, the distance to set the range to
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetRange(float a_range);

	//////////////////////////////////////////////////////////////////////////
	// Set the Attenuation factor of the light
	//
	// Paramaters:
	// a_attenuationFactor, the attenuation factor to set to the light
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetAttenuation(float a_attenuationFactor);

	//////////////////////////////////////////////////////////////////////////
	// Set the cone for the spot light
	//
	// Paramaters:
	// a_theta, the inner circle of the cone
	// a_phi, the outer circle of the cone
	//
	// Returns void
	//
	//////////////////////////////////////////////////////////////////////////
	void SetCone(float a_theta, float a_phi);

	//////////////////////////////////////////////////////////////////////////
	// Get the Light Data
	//
	// Paramaters:
	// None
	//
	// Returns a reference to the light
	//
	//////////////////////////////////////////////////////////////////////////
	const D3DLIGHT9& GetLightData() { return m_light; }

protected:
	//Direct3d light
	D3DLIGHT9 m_light;
};

#endif //LIGHT_H